/* vue */
import { ComponentOptions, CreateElement, VNode } from 'vue'
/* types */
import { 
  BaseSelectUserGetDepartmentListModel, 
  BaseSelectUserGetDepartmentListResult, 
  BaseSelectUserGetDepartmentUserListModel, 
  BaseSelectUserGetDepartmentUserListResult, 
  BaseSelectUserGetSearchMoreUserListModel, 
  BaseSelectUserGetProjectTeamUserListResult, 
  BaseSelectUserGetProjectTeamListResult, 
  BaseSelectUserGetSearchUserListModel, 
  BaseSelectUserGetSearchUserListResult, 
  BaseSelectUserSelectedItemType, 
  BaseSelectUserGetSearchMoreUserListResult 
} from '@src/component/common/BaseSelectUser/types'
/* enum */
import { BaseSelectUserModeEnum } from '@src/component/common/BaseSelectUser/model/enum'
/* model */
import MsgModel from '@model/MsgModel'
import { DynamicVM } from '@src/component/common/BaseSelectUser/components/Dynamic'
// @ts-ignore
import { SHBProductLineEnum } from '@shb-lib/tenant'

interface BaseSelectUserOptions {
  renderFilterContent?: any
  isRenderFilterContent?: any
  isScreenSelect?: any
  // 标题
  title?: string;
  // 当前默认选中的标签
  currentTabType?: string;
  // 最大选择数量
  max?: number;
  // 是否将当前组件与tab绑定
  isBind?: boolean;
  // 是否严格的遵循父子不互相关联的做法
  isCheckStrictly?: boolean;
  // 窗口是否唯一
  unique?: boolean;
  // 窗口是否置顶
  top?: boolean;
  // 挂载元素 | 元素id
  mountEl?: Element | string;
  // 是否能选人
  isCanChooseUser?: boolean;
  // 是否能选部门
  isCanChooseDepartment?: boolean;
  // 是否能选角色
  isCanChooseRole?: boolean;
  // 是否能选服务商
  isCanChooseServiceProvider?: boolean;
  // 是否为 团队模式。(默认值：undefined)，如果传了参数，就以前端的参数为准，如果没传，就以租户的配置为主。
  isTag?: boolean;
  // 显示显示人员 (默认值：true)
  isShowUser?: boolean;
  // 显示显示搜索 (默认值：true)
  isShowSearch?: boolean;
  // 显示显示动态获取tab (默认值：false)
  isShowDynamic?: boolean;
  // 显示显示搜索组织架构人员 (默认值：true)
  isShowSearchOrganizationUsers?: boolean;
  // 显示显示搜索服务商人员 (默认值：true)
  isShowSearchServiceProviderUsers?: boolean;
  // 显示为触发器消息通知选人 (默认值：false)
  isTrigger?: boolean;
  // 是否只显示服务云角色 (默认值：false)
  isOnlyShowBusinessServiceCloudRole?: boolean;
  isNeedEmail?: boolean;
  // 是否显示角色 tab (默认值：true)
  showRole?: boolean;
  // 是否显示项目组 tab (默认值false)
  showProjectTeam?: boolean;
  // 是否显示部门 tab (默认值：true)
  showDepartment?: boolean;
  // 是否显示服务商 根据 mode 属性决定 (默认值：true)
  showServiceProvider?: boolean;
  // 是否显示已删除 根据 mode 属性决定 (默认值：true)
  showDelete?: boolean;
  // 是否显示未分配 根据 mode 属性决定 (默认值：true)
  showNoDistribute?: boolean;
  // 服务商人员是否显示部门 tab (默认值：false)
  showTagIfSpUser?: boolean;
  // 是否显示 已注销 (默认值：true)
  showCancel?: boolean;
  // 是否显示 服务商全部 (默认值：false)
  showSpAll?: boolean;
  // 已选择 人员数据数据 (兼容旧的)
  selected?: BaseSelectUserSelectedItemType[];
  // 已选择 人员列表数据
  selectedUsers?: SelectUserComponentUser[];
  // 已选择 部门列表数据
  selectedDepartments?: SelectUserComponentDepartment[];
  // 已选择 角色列表数据
  selectedRoles?: SelectUserComponentRole[];
  // 已选择 服务商列表数据
  selectedServiceProviders?: SelectUserComponentServiceProvider[];
  // 已选择全部数据 
  selectedAll?: BaseSelectUserSelectedItemType[];
  // 模式
  mode?: BaseSelectUserModeEnum;
  // 窗口配置项
  baseWindowOptions?: Record<string, any>;
  // 服务商类型 '' 显示部门和服务商 0 显示部门 1 显示服务商
  typeServiceProvider?: string;
  // 获取部门列表方法
  fetchDepartmentList?: (params: BaseSelectUserGetDepartmentListModel) => Promise<MsgModel<BaseSelectUserGetDepartmentListResult>>;
  // 获取部门人员列表方法
  fetchDepartmentUserList?: (params: BaseSelectUserGetDepartmentUserListModel) => Promise<MsgModel<BaseSelectUserGetDepartmentUserListResult>>;
  // 获取搜索人员列表方法
  fetchSearchUserList?: (params: BaseSelectUserGetSearchUserListModel) => Promise<MsgModel<BaseSelectUserGetSearchUserListResult>>;
  // 获取搜索更多人员列表方法
  fetchSearchMoreUserList?: (params: BaseSelectUserGetSearchMoreUserListModel) => Promise<MsgModel<BaseSelectUserGetSearchMoreUserListResult>>;
  // 获取项目列表方法
  fetchProjectTeamList?: (params: any) => Promise<MsgModel<BaseSelectUserGetProjectTeamListResult>>;
  // 获取项目人员列表方法
  fetchProjectTeamUserList?: (params: any) => Promise<MsgModel<BaseSelectUserGetProjectTeamUserListResult>>;
  // 自定义渲染动态获取选项卡内容
  renderDynamicContent?: (h: CreateElement, context: DynamicVM) => Element | VNode | null | undefined;
  // 获取实例
  getInstance?: ({ close }: { close: VoidFunction }) => void;
  // 自定义渲染动态获取选项卡标题
  DynamicTabName?: string;
  // 区分部门、团队权限
  authKey?: string;
  // 服务商是否隐藏没有工程师的
  hideNullProvider?: boolean;
  // 异步调用是否确认
  asyncConfirm?: (checked: BaseSelectUserSelectedItemType[]) => Promise<boolean>;
}

interface BaseSelectUserPropsOptions {
  // 标题
  title?: string;
  // 当前默认选中的标签
  currentTabType: string,
  // 最大选择数量
  max?: number;
  // 窗口是否置顶 (默认值：true)
  top: boolean;
  // 是否将当前组件与tab绑定
  isBind?: boolean;
  // 是否严格的遵循父子不互相关联的做法
  isCheckStrictly?: boolean;
  // 窗口是否唯一
  unique?: boolean;
  // 是否能选人
  isCanChooseUser: boolean;
  // 是否能选部门
  isCanChooseDepartment: boolean;
  // 是否能选角色
  isCanChooseRole: boolean;
  // 是否能选服务商
  isCanChooseServiceProvider: boolean;
  // 显示显示人员 (默认值：true)
  isShowUser: boolean;
  // 显示显示搜索 (默认值：true)
  isShowSearch: boolean;
  // 显示显示动态获取tab (默认值：false)
  isShowDynamic: boolean;
  // 显示显示搜索组织架构人员 (默认值：true)
  isShowSearchOrganizationUsers: boolean;
  // 显示显示搜索服务商人员 (默认值：true)
  isShowSearchServiceProviderUsers: boolean;
  // 是否为 团队模式。(默认值：undefined)，如果传了参数，就以前端的参数为准，如果没传，就以租户的配置为主。
  isTag?: boolean;
  // 区分部门、团队权限
  authKey?: string;
  // 显示为触发器消息通知选人 (默认值：false)
  isTrigger: boolean;
  // 是否只显示服务云角色 (默认值：false)
  isOnlyShowBusinessServiceCloudRole: boolean;
  isNeedEmail: boolean;
  // 已选择数据
  selected: BaseSelectUserSelectedItemType[];
  // 是否显示角色 tab (默认值：true)
  showRole: boolean;
  // 是否显示项目组 tab (默认值false)
  showProjectTeam: boolean;
  // 是否显示部门 tab (默认值：true)
  showDepartment: boolean;
  // 是否显示服务商
  showServiceProvider: boolean;
  // 是否显示已删除 (默认值：true)
  showDelete: boolean;
  // 是否显示未分配 (默认值：true)
  showNoDistribute: boolean;
  // 是否显示 已注销 (默认值：true)
  showCancel: boolean;
  // 是否显示 服务商全部 (默认值：false)
  showSpAll: boolean;
  // 服务商人员是否显示部门 tab (默认值：false)
  showTagIfSpUser: boolean;
  // 窗口配置项
  baseWindowOptions: Record<string, any>;
  // 获取部门列表方法
  fetchDepartmentList?: (params: BaseSelectUserGetDepartmentListModel) => Promise<MsgModel<BaseSelectUserGetDepartmentListResult>>;
  // 获取部门人员列表方法
  fetchDepartmentUserList?: (params: BaseSelectUserGetDepartmentUserListModel) => Promise<MsgModel<BaseSelectUserGetDepartmentUserListResult>>;
  // 获取搜索人员列表方法
  fetchSearchUserList?: (params: BaseSelectUserGetSearchUserListModel) => Promise<MsgModel<BaseSelectUserGetSearchUserListResult>>;
  // 获取搜索更多人员列表方法
  fetchSearchMoreUserList?: (params: BaseSelectUserGetSearchMoreUserListModel) => Promise<MsgModel<BaseSelectUserGetSearchMoreUserListResult>>;
  // 获取项目列表方法
  fetchProjectTeamList?: (params: any) => Promise<MsgModel<BaseSelectUserGetProjectTeamListResult>>;
  // 获取项目人员列表方法
  fetchProjectTeamUserList?: (params: any) => Promise<MsgModel<BaseSelectUserGetProjectTeamUserListResult>>;
  // 自定义渲染动态获取选项卡内容
  renderDynamicContent?: (h: CreateElement, context: DynamicVM) => Element | VNode | null | undefined;
  // 是否显示筛选，只有指定是false才不显示
  isScreenSelect?:boolean;
  // 是否自定义筛选内容
  isRenderFilterContent?:boolean;
  renderFilterContent?:any;
  CustomOptions?:any;
    // 自定义渲染动态获取选项卡标题
    DynamicTabName?: string;
  // 服务商是否隐藏没有工程师的
  hideNullProvider?: boolean;
  // 异步调用是否确认
  asyncConfirm?: (checked: BaseSelectUserSelectedItemType[]) => Promise<boolean>;
}

interface SelectUser {
  // 用户 id
  userId: string;
  // 用户 staffId ，用于企微端显示人员名称
  staffId: string;
  // 类型 id
  typeId: number;
  // 用户名称
  displayName: string;
  // 用户邮箱
  email: string | null;
  // 用户头像
  head: string;
  // 用户手机号
  phone: string;
  // 用户状态
  state: string;
  // 用户状态颜色
  stateColor: string;
  // 人员标签列表
  labelNameList: string[];
  // 是否为团队主管
  isTeamLeader: number | null;
  // 是否为已删除 (0：未删除，1：已删除)
  isDelete: number | null;
  tagNameList: string[] | null;

  userTypeList?: Number[];
  CustomOptions?:any;
}

/* 用户状态 */
interface SelectUserState {
  // 状态文本
  state: string;
  // 状态颜色
  color: string;
}

interface SelectUserLabel {
  id: number;
  name: string;
}

interface SelectUserDepartment {
  // 部门id
  id: string;
  // 类型 id
  typeId: number;
  // 部门头像
  logo: string;
  // 部门名称
  name: string;
  // 当前部门下的人员数量 (包含子部门人员数量)
  userCount: number;
  // 当前部门下的人员数量 (不包含子部门人员数量)
  userTotalCount: number;
  // 子部门
  tagChildren: SelectUserDepartment[];
  // 用户列表
  userList: SelectUser[];
  dingId?: string;
}

interface SelectUserProjectTeam {
  id: string;
  // 名称
  name: string;
  userCount: number;
}

interface SelectUserRole {
  // 角色id
  id: string;
  // 角色头像
  logo: string;
  // 类型 id
  typeId: number;
  // 角色名称
  name: string;
  // 当前角色下的人员数量
  userCount: number;
  // 当前角色对应的产品线
  productLine: SHBProductLineEnum;
}

interface SelectUserServiceProvider {
  // 服务商id
  id: string;
  // 服务商头像
  logo: string;
  // 类型 id
  typeId: number;
  // 服务商名称
  name: string;
  // 当前服务商下的人员数量
  userCount: number;
  // 子服务商
  tagChildren: SelectUserServiceProvider[];
}

interface SelectUserComponentUser extends SelectUser {
  disabled?: boolean;
}

interface SelectUserComponentDepartment extends SelectUserDepartment {
  isRoot?: boolean;
}

interface SelectUserComponentRole extends SelectUserRole {
  // 是否为客服云
  isCustomerServiceCloud?: boolean;
  // 是否为服务云
  isServiceCloud?: boolean;
  // 是否隐藏 复选框
  isHideCheckbox?: boolean;
  // 子级
  children?: SelectUserComponentRole[];
  tagChildren?: SelectUserComponentRole[];
}

interface SelectUserComponentProjectTeam {
  userId: string;
  staffId: string;
  displayName: string;
  head: string;
}

interface SelectUserComponentServiceProvider extends SelectUserServiceProvider {
  
}

/* 选人组件选项卡 */
interface BaseSelectUserTab {
  name: string;
  label: string;
  component: ComponentOptions<any>;
}

/* 选人组件 已选择项 */
interface BaseSelectUserSelectedItem {
  img: string;
  name: string;
  id: string;
  typeId: string;
  staffId: string;
  userTypeList: any;
  disabled?: boolean;
}

// 当前组件与tab绑定的列表
interface BaseBindTabFunOptions {
  close: () => void;
  show: () => void;
  hidden: () => void;
}
interface BaseBindTabInfoOptions {
  [x: string]: BaseBindTabFunOptions;
}

export {
  BaseSelectUserOptions,
  BaseSelectUserPropsOptions,
  SelectUser,
  SelectUserState,
  SelectUserLabel,
  SelectUserDepartment,
  SelectUserProjectTeam,
  SelectUserRole,
  SelectUserServiceProvider,
  SelectUserComponentUser,
  SelectUserComponentDepartment,
  SelectUserComponentRole,
  SelectUserComponentProjectTeam,
  SelectUserComponentServiceProvider,
  BaseSelectUserTab,
  BaseSelectUserSelectedItem,
  BaseBindTabFunOptions,
  BaseBindTabInfoOptions,
}